package javase.ch06.annotation.book;

import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 *   什么是注解解析
 *         * 使用Java技术获得注解上数据的过程则称为注解解析。
 *     与注解解析相关的接口
 *         * Annotation: 注解类，该类是所有注解的父类。
 *         * AnnotatedElement:该接口定义了与注解解析相关的方法
 *              T getAnnotation(Class<T> annotationClass) 根据注解类型获得对应注解对象
 *              Annotation[]        getAnnotations()
 *                 * 获得当前对象上使用的所有注解，返回注解数组，包含父类继承的
 *              Annotation[]        getDeclaredAnnotations()
 *                 * 获得当前对象上使用的所有注解，返回注解数组,只包含本类的
 *              boolean        isAnnotationPresent(Class<Annotation> annotationClass)
 *                 * 判断当前对象是否使用了指定的注解，如果使用了则返回true，否则false
 *
 *         获取注解数据的原理
 *             * 注解作用在哪个成员上就会得该成员对应的对象来获得注解
 *                 * 比如注解作用成员方法，则要获得该成员方法对应的Method对象
 *                 * 比如注解作用在类上，则要该类的Class对象
 *                 * 比如注解作用在成员变量上，则要获得该成员变量对应的Field对象。
 *             * Field,Method,Constructor，Class等类都是实现了AnnotatedElement接口
 */
public class TestAnnotaion {
    @Test
    public void test1(){
        Class<BookStore> bookStoreClass = BookStore.class;
        Book declaredAnnotation = bookStoreClass.getDeclaredAnnotation(Book.class);
        System.out.println("书名=" + declaredAnnotation.value());
        System.out.println("价格=" + declaredAnnotation.price());
        System.out.println("作者=" + Arrays.toString(declaredAnnotation.authors()));
    }

    @Test
    public void test2() throws NoSuchMethodException {
        Class<BookStore> bookStoreClass = BookStore.class;
        Method purchae = bookStoreClass.getDeclaredMethod("purchae");
        if(purchae.isAnnotationPresent(Book.class)){

            Book annotation = purchae.getDeclaredAnnotation(Book.class);
            System.out.println("书名=" + annotation.value());
            System.out.println("价格=" + annotation.price());
            System.out.println("作者=" + Arrays.toString(annotation.authors()));
        }else{
            System.out.println("当前方法没有Book注解");
        }
    }

    @Test
    public void test3() throws NoSuchFieldException {
        Class<BookStore> clazz = BookStore.class;
        Field name = clazz.getDeclaredField("name");
        if(name.isAnnotationPresent(Book.class)){
            Book declaredAnnotation = name.getDeclaredAnnotation(Book.class);
            System.out.println("书名=" + declaredAnnotation.value());
            System.out.println("价格=" + declaredAnnotation.price());
            System.out.println("作者=" + Arrays.toString(declaredAnnotation.authors()));
        }else{
            System.out.println("当前成员变量没有Book注解");
        }
    }

}
